package br.com.nrti.still;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Calendar;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnKeyListener;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

/**
 * @author Nilson Rodrigo Carraro Classe para criação das caixas de diálogo e
 *         mensagens
 */

public class Mensagens {

	private static int ret_dia = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
	private static int ret_mes = Calendar.getInstance().get(Calendar.MONTH);
	private static int ret_ano = Calendar.getInstance().get(Calendar.YEAR);

	private static int ret_hora = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
	private static int ret_minuto = Calendar.getInstance().get(Calendar.MINUTE);

	private static Method metodoAfterSetDate;
	private static Method metodoAfterSetTime;
	private static Object objAfterSetDateTime;

	public static ArrayList<Dialog> openedMessages = new ArrayList<Dialog>();


	/**
	 * Cria uma caixa de mensagem simples, apenas com textos e botões
	 * 
	 * @param context
	 * @param titulo
	 * @param mensagem
	 * @param buttonsMsg
	 * @return Builder
	 */
	private static AlertDialog.Builder criarDialogo(Context context, String titulo, String mensagem,
			ButtonMsg[] buttonsMsg, View conteudo, boolean isCustom, Boolean showKey, int iconId) {
		try {
			final Builder retorno = new Builder(context);
			retorno.setMessage(mensagem);

			if (titulo != null)
				retorno.setTitle(titulo);

			includeKeyListener(retorno);

			retorno.setCancelable(isCustom);
			if (iconId != 0)
				retorno.setIcon(iconId);

			if (conteudo != null) {
				retorno.setView(conteudo);
			}

			if (buttonsMsg == null) {
				ButtonMsg btOK = new ButtonMsg();
				btOK.setTexto("OK");
				btOK.setTipo(DialogInterface.BUTTON_POSITIVE);

				buttonsMsg = new ButtonMsg[] { btOK };
			}

			if (!isCustom) {
				for (ButtonMsg botao : buttonsMsg) {
					switch (botao.getTipo()) {
					case DialogInterface.BUTTON_POSITIVE:
						retorno.setPositiveButton(botao.getTexto(), botao.getEvento());
						break;
					case DialogInterface.BUTTON_NEGATIVE:
						retorno.setNegativeButton(botao.getTexto(), botao.getEvento());
						break;
					case DialogInterface.BUTTON_NEUTRAL:
						retorno.setNeutralButton(botao.getTexto(), botao.getEvento());
						break;
					}
				}
			} else {
				LinearLayout llGeral = new LinearLayout(Application.appContext);
				LinearLayout llConteudo = new LinearLayout(Application.appContext);

				TableLayout tlBotoes = new TableLayout(Application.appContext);
				TableRow tr = new TableRow(Application.appContext);
				tlBotoes.addView(tr);

				tlBotoes.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.FILL_PARENT,
						LayoutParams.WRAP_CONTENT));
				tr.setLayoutParams(new TableRow.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

				llConteudo.addView(conteudo);

				llGeral.setOrientation(LinearLayout.VERTICAL);
				llGeral.addView(llConteudo);
				llGeral.addView(tlBotoes);

				for (ButtonMsg botao : buttonsMsg) {
					Button bt = new Button(Application.appContext);
					bt.setText(botao.getTexto());
					bt.setTag(botao);

					bt.setOnClickListener(new View.OnClickListener() {
						@Override
						public void onClick(View arg0) {
							if (arg0.getTag() != null) {
								if (((ButtonMsg) arg0.getTag()).getEvento() != null)
									((ButtonMsg) arg0.getTag()).getEvento().onClick(retorno.create(),
											((ButtonMsg) arg0.getTag()).getTipo());
								else
									retorno.create().dismiss();
							}
						}
					});
					tr.addView(bt);
				}

				retorno.setView(llGeral);
			}

			if (showKey) {
				InputMethodManager imm = (InputMethodManager) Application.appContext
						.getSystemService(Application.appContext.INPUT_METHOD_SERVICE);
				imm.toggleSoftInput(0, 0);
			}

			return retorno;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * Retorna um Dialog que pode ser exibido ou não
	 * 
	 * @param titulo
	 * @param mensagem
	 * @param botoes
	 * @return
	 */

	public static Dialog showMessage(String titulo, String mensagem, ButtonMsg[] botoes) {
		return showMessage(titulo, mensagem, botoes, 0);
	}

	public static Dialog showMessage(String titulo, String mensagem, ButtonMsg[] botoes, int leftIcon) {
		AlertDialog novaMensagem = criarDialogo(Application.appContext, titulo, mensagem, botoes, null, false, false,
				leftIcon).create();

		openedMessages.add(novaMensagem);
		return novaMensagem;
	}

	/**
	 * Retorna um Dialog com conteúdo personalizado, que pode ser exibido ou não
	 * 
	 * @param titulo
	 * @param mensagem
	 * @param botoes
	 * @param conteudo
	 * @return
	 */

	public static Dialog showMessage(String titulo, String mensagem, ButtonMsg[] botoes, View conteudo, Boolean showKey) {
		AlertDialog novaMensagem = criarDialogo(Application.appContext, titulo, mensagem, botoes, conteudo, false,
				showKey, 0).create();
		openedMessages.add(novaMensagem);
		return novaMensagem;
	}

	public static Dialog showMessage(String titulo, String mensagem, ButtonMsg[] botoes, View conteudo) {
		AlertDialog novaMensagem = criarDialogo(Application.appContext, titulo, mensagem, botoes, conteudo, false,
				false, 0).create();
		openedMessages.add(novaMensagem);
		return novaMensagem;
	}

	public static Dialog inputBox(String titulo, String mensagem, EditText compEntrada, ButtonMsg botaoOK) {
		ButtonMsg botaoCancel = new ButtonMsg("Cancelar", null);
		botaoCancel.setTipo(DialogInterface.BUTTON_NEGATIVE);
		botaoOK.setTipo(DialogInterface.BUTTON_POSITIVE);

		AlertDialog novaMensagem = criarDialogo(Application.appContext, titulo, mensagem,
				new ButtonMsg[] { botaoOK, botaoCancel }, compEntrada, false, false, 0).create();
		openedMessages.add(novaMensagem);
		return novaMensagem;
	}

	/**
	 * Retorna um Dialog com conteúdo personalizado, que pode ser exibido ou
	 * não, sem exibir os botões padrão do dialog
	 * 
	 * @param titulo
	 * @param mensagem
	 * @param botoes
	 * @param conteudo
	 * @return
	 */
	public static Dialog showMessageNoShowButtons(String titulo, String mensagem, ButtonMsg[] botoes, View conteudo) {
		AlertDialog novaMensagem = criarDialogo(Application.appContext, titulo, mensagem, botoes, conteudo, true,
				false, 0).create();
		openedMessages.add(novaMensagem);
		return novaMensagem;
	}

	/**
	 * Exibe um Toast no device
	 * 
	 * @param texto
	 */
	public static void showNotification(String texto) {
		CharSequence text = texto;
		Toast toast = Toast.makeText(Application.appContext, text, Toast.LENGTH_LONG);
		toast.show();
	}

	/**
	 * Cria uma caixa de mensagem com o layout informado
	 * 
	 * @param titulo
	 * @param mensagem
	 * @param Positive
	 *            - se for null, não mostra o botão
	 * @param Negative
	 *            - se for null, não mostra o botão
	 * @param layout
	 */

	public static void DialogBox(String titulo, String mensagem, OnClickListener Positive, OnClickListener Negative,
			View layout) {
		DialogBox(titulo, mensagem, Positive, Negative, layout, false).show();
	}

	public static Dialog DialogBox(String titulo, String mensagem, OnClickListener Positive, OnClickListener Negative,
			View layout, boolean noButtons) {
		AlertDialog.Builder alert = new AlertDialog.Builder(Application.appContext);
		alert.setTitle(titulo);
		alert.setCancelable(false);

		includeKeyListener(alert);

		if (mensagem != null && !mensagem.equals(""))
			alert.setMessage(mensagem);
		alert.setView(layout);

		if (Positive != null) {
			alert.setPositiveButton("OK", Positive);
		}

		if (Negative != null) {
			alert.setNegativeButton("Cancelar", Negative);
		}

		/**
		 * Se os dois botões forem passados como null, cria um botão neutro de
		 * OK
		 */
		if (Positive == null && Negative == null && !noButtons) {
			alert.setPositiveButton("OK", null);
		}

		return alert.create();
	}

	/**
	 * Cria e exibe uma caixa de mensagem com um título, uma lista de opções
	 * para o usuário escolher e botão para cancelar a necessidade de seleção e
	 * voltar ao contexto de chamada
	 * 
	 * @param titulo
	 *            Título da mensagem a ser exibida
	 * @param listItens
	 *            Lista de opções para seleção do usuário
	 * @param selectAction
	 *            Ação a ser realizada pós seleção
	 */
	public static void showOptionList(String titulo, CharSequence[] listItens, OnClickListener selectAction) {
		AlertDialog.Builder optionList = new AlertDialog.Builder(Application.appContext);
		optionList.setTitle(titulo);
		optionList.setItems(listItens, selectAction);

		includeKeyListener(optionList);
		// optionList.setSingleChoiceItems(listItens, -1, selectAction);
		optionList.setNegativeButton("Cancelar", null);
		optionList.show();
	}

	/**
	 * Impede que a caixa de diálogo seja fechada quando o usuário seleciona uma
	 * das teclas citadas no "IF"
	 * 
	 * @param dialog
	 */
	private static void includeKeyListener(AlertDialog.Builder dialog) {
		dialog.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent keyEvent) {
				if (keyCode == KeyEvent.KEYCODE_SEARCH || keyCode == KeyEvent.KEYCODE_MENU)
					return true;

				return false;
			}
		});
	}

}
